iT邦幫忙

DAY 29
8

快快樂樂學會讓電腦幫我做事系列 第 26

[Shell Script] Day29-Shell Script 也可以寫測試

  • 分享至 

  • xImage
  •  

在介紹一連串的 shell script 之後,相信應該也會有人跟我一樣遇到一些問題那就是,我的 script 如果不小心寫出 bug 或改出 bug 怎麼辦?難不成真的要用之前提到的 set -xv 逐行去看嗎?如果我的 script 會跑一兩個小時呢?我就要花一兩個小時去測試嗎?
在介紹一連串的 shell script 之後,相信應該也會有人跟我一樣遇到一些問題那就是,我的 script 如果不小心寫出 bug 或改出 bug 怎麼辦?難不成真的要用之前提到的 set -xv 逐行去看嗎?如果我的 script 會跑一兩個小時呢?我就要花一兩個小時去測試嗎?

一開始我也是對於這個滿困擾的,後來我發現 shell script 其實也是可以寫 unit test 的。如果我們有寫 unit test 那這樣一來不但可以安心的修改、重構我們的 shell script,也可以放心大膽的說我們寫出來的 shell script 是可以用的。至少目前沒發現 bug ,如果有 bug 也可以很迅速的修復並且保證不會再發生相同的 bug ,因為我們有 Unit Test 在把關!

那麼我使用的 Unit Test Frame work 是基於 xUnit 的 Testing framework,使用起來跟我們再寫其他的 UnitTest 也很類似,因此學習的門檻也就不高!其他的重點就是要放在『怎麼寫出可以測試的』 shell script 或者採用TDD來寫也是可以,這邊我就不探討了,有興趣的人可以參考 91哥去年鐵人賽的文章,服用後包準你功力大增。

首先是下載我們所需要的 Unit Test Framework – shunit2

把下載下來的 shunit2 解壓縮後會看到以下資料夾:

在 examples 裡面有很多關於寫 shell script 的範例,而我們需要的主要檔案是放在 src/ 裡面的 shunit2 這個檔案。所以我們也可以單獨將這個檔案複製到 /usr/local/lib 然後再來使用它,或只你想放到任何地方都可以!

現在就讓我們先來試試看最簡單的測試吧!

假設我們有一個涵式他會回傳 Hello World!! ,那我們該怎麼測試這個涵式是否運作正常呢?(在這個範例中尉了解說方便,我就把測試和被測試程式寫在一起比清楚,當然你也可以在 unit test 中用 source 來引入你的被測試程式)

首先我們的測試程式都必須是 test 開頭,好讓 shunit2 辨識這個是 unit test,再來就是在測試程式中寫測試的內容。

這個範例用到的測試判斷式為:

assertEquals [當測試失敗時所要顯示的訊息] [期望值] [實際值]

所以我們的範例程式如下:

#!/bin/bash

# 要被測試的涵式
hello() {
    echo "Hello world"
}

# 一定要用 test 開頭
test_hello() {
    assertEquals "測試是否有回傳 Helloworld" "$(hello)" "Hello world"
}

# 因為我將 shunit2 放到 /usr/local/lib ,所以我引入的位置就會在那
source "/usr/local/lib/shunit2"

執行結果如下:

那如果我再加一個測試故意讓他失敗,我們來看看結果會如何。
首先我們將我們的程式碼加一個 add() 涵式,和他的測試涵式如下:

#!/bin/bash

hello() {
    echo "Hello world"
}

add(){
    echo "$(($1+$2))"
}

test_hello() {
    assertEquals "測試是否有回傳 Helloworld" "$(hello)" "Hello world"
}

test_add() {
    actual=$(add 1 3)
    expected=2
    assertEquals "測試加法" "$expected" "$actual"
}

source "/usr/local/lib/shunit2"

有沒有注意到我在測試加法時,我測試的是 1+3 但是我期望他等於 2,而我在訊息的部分是寫『測試加法』。所以我們執行測試時他一定會失敗,並且顯示該訊息;

其他更多的測試判斷可以參考 shunit2-2.1.6/doc 底下的 shunit2.txt


上一篇
[Shell Script] Day28-太多共同的 function 怎麼辦
下一篇
[Shell Script] Day30-衝阿~終點站
系列文
快快樂樂學會讓電腦幫我做事27
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

我要留言

立即登入留言